package com.ftwj.demo.modular.service;

import java.util.Date;
import java.util.List;
import java.util.Optional;

import javax.validation.constraints.Positive;

import org.apache.commons.lang3.StringUtils;
import org.quartz.CronExpression;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.ftwj.demo.base.common.BaseService;
import com.ftwj.demo.base.util.PageInfoBean;
import com.ftwj.demo.config.quartz.JobInformation;
import com.ftwj.demo.config.quartz.QuartzManager;
import com.ftwj.demo.modular.dao.ScheduleJobDao;
import com.ftwj.demo.modular.entity.ScheduleJobBean;
import com.ftwj.demo.global.shiro.ShiroUtil;
import com.ftwj.demo.utils.exception.DataAccessException;
import com.ftwj.demo.utils.exception.ScheduleException;

/**
*
* <p>Title: ScheduleJobService</p>  
* <p>Description: 描述:业务逻辑</p>
* <p>Copyright: Copyright (c) 2020 </p>  
* <p>Company: 兰州飞天网景信息产业有限公司</p>    
* @author WangSli
* @date 2020年04月16日 14:02:35
* @version V1.0
*/
@Service
public class ScheduleJobService extends BaseService<ScheduleJobBean, Integer> {
	
	@Autowired
	private ScheduleJobDao dao;
	@Autowired
	private QuartzManager quartzManager;

	/**
	 * <p>Title: page</p>  
	 * <p>Description: 分页</p>  
	 * @param bean
	 * @param pageInfo
	 * @author HeYang
	 * @date 2020年4月16日  
	 * @version 1.0
	 */
	@SuppressWarnings("unchecked")
	public PageInfoBean page(ScheduleJobBean bean, PageInfoBean pageInfo) {
		PageInfoBean page = dao.pageByExample(bean, pageInfo);
		List<ScheduleJobBean> list = (List<ScheduleJobBean>) pageInfo.getRecList();
		for (ScheduleJobBean data : list) {//获取运行状态
			String triggerState = quartzManager.getJobInfo(data.getName(), data.getGroup());
			data.setTriggerState(triggerState);
		}
		return page;
	}

	/**
	 * <p>Title: findById</p>  
	 * <p>Description: 获取详情</p>  
	 * @param id
	 * @return 
	 * @author HeYang
	 * @date 2020年4月16日  
	 * @version 1.0
	 */
	public ScheduleJobBean findById(@Positive Integer id) {
		ScheduleJobBean data = Optional.ofNullable(dao.query(id)).get();
		String triggerState = quartzManager.getJobInfo(data.getName(), data.getGroup());
		data.setTriggerState(triggerState);
		return data;
	}

	/**
	 * <p>Title: addBean</p>  
	 * <p>Description: 开启调度任务</p>  
	 * @param entity
	 * @author HeYang
	 * @date 2020年4月16日  
	 * @version 1.0
	 */
	@Transactional
	public int add(ScheduleJobBean entity) {
		if(!CronExpression.isValidExpression(entity.getCron())) {
			throw new ScheduleException("cron表达式错误!");
		}
		if(StringUtils.isEmpty(entity.getClassName())) {
			throw new ScheduleException("定时任务处理类不能为空!");
		}
		int count = dao.queryCountByNameAndGroup(entity);
		if(count > 0) {
			throw new ScheduleException("调度器已存在，不能重复开启");
		}
		entity.setCreateUser(ShiroUtil.getUserId()).setCreateTime(new Date());
		int i = dao.insert(entity);
		//开启调度任务
		JobInformation jobInfo = quartzManager.buildJobInformation(entity.getName(), entity.getGroup(),entity.getDescription(), entity.getCron(), entity.getClassName(), entity.getParams());
		boolean r = quartzManager.startJobTask(jobInfo);
		if(i > 0 && r) {
			return i;
		}else {
			throw new ScheduleException("开启调度器异常");
		}
	}

	/**
	 * <p>Title: saveBean</p>  
	 * <p>Description: 修改调度任务</p>  
	 * @param entity
	 * @return 
	 * @author HeYang
	 * @date 2020年4月16日  
	 * @version 1.0
	 */
	@Transactional
	public int save(ScheduleJobBean entity) {
		if(!CronExpression.isValidExpression(entity.getCron())) {
			throw new ScheduleException("cron表达式错误!");
		}
		entity.setCreateUser(ShiroUtil.getUserId()).setCreateTime(new Date());//主键必须存在
		int i = dao.update(entity);
		//调度任务修改cron表达式
		boolean r = quartzManager.modifyJob(entity.getName(), entity.getGroup(), entity.getCron());
		if(i > 0 && r) {
			return i;
		}else {
			throw new ScheduleException("修改调度器异常");
		}
	}

	/**
	 * <p>Title: remoById</p>  
	 * <p>Description: 删除单个调度任务</p>  
	 * @param id
	 * @return 
	 * @author HeYang
	 * @date 2020年4月16日  
	 * @version 1.0
	 */
	@Transactional
	public int remo(Integer id) {
		ScheduleJobBean data = dao.query(id);
		int i = dao.delete(id);
		//删除单个调度任务
		boolean r = quartzManager.remoJob(data.getName(), data.getGroup());
		if(i > 0 && r) {
			return i;
		}else {
			return 0;
		}
	}

	/**
	 * <p>Title: removeByIds</p>  
	 * <p>Description: 批量删除调度任务</p>  
	 * @param ids
	 * @author HeYang
	 * @date 2020年4月16日  
	 * @version 1.0
	 */
	@Transactional
	public int remo(Integer[] ids) {
		for (Integer id : ids) {//批量删除
			ScheduleJobBean data = dao.query(id);
			quartzManager.remoJob(data.getName(), data.getGroup());
			dao.delete(id);
		}
		return 1;
	}
	
	/**
	 * <p>Title: allList</p>  
	 * <p>Description: 查询所有状态正常的调度任务</p>  
	 * @author HeYang
	 * @date 2020年4月16日  
	 * @version 1.0
	 */
	public List<ScheduleJobBean> findListByState(Integer state) {
		ScheduleJobBean scheduleJob = new ScheduleJobBean();
		scheduleJob.setState(state);
		return dao.queryListByExample(scheduleJob);
	}

	/**
	 * <p>Title: pauseAll</p>  
	 * <p>Description: 全部暂停</p>   
	 * @author HeYang
	 * @date 2020年4月16日  
	 * @version 1.0
	 */
	@Transactional
	public int pause() {
		int i = dao.pauseAll();
		boolean flag = quartzManager.pauseAllJob();
		if(i > 0 && flag) {
			return i;
		}else {
			return 0;
		}
	}

	/**
	 * <p>Title: restartAll</p>  
	 * <p>Description: 开启所有已暂停的任务</p>   
	 * @author HeYang
	 * @date 2020年4月16日  
	 * @version 1.0
	 */
	@Transactional
	public int restart() {
		int i = dao.restartAll();
		boolean flag = quartzManager.restartAllJob();
		if(i > 0 && flag) {
			return i;
		}else {
			return 0;
		}
	}

	/**
	 * <p>Title: pause</p>  
	 * <p>Description: 暂停单个调度</p>  
	 * @param id
	 * @return 
	 * @author HeYang
	 * @date 2020年4月17日  
	 * @version 1.0
	 */
	@Transactional
	public int pause(Integer id) {
		ScheduleJobBean data = dao.query(id);
		if(data==null) {
			throw new DataAccessException("该任务不存在") ;
		}
		ScheduleJobBean sche = new ScheduleJobBean();
		sche.setJobId(id).setState(0);
		int i = dao.update(sche);
		boolean flag = quartzManager.pauseJob(data.getName(), data.getGroup());
		if(i > 0 && flag) {
			return i;
		}else {
			return 0;
		}
	}

	/**
	 * <p>Title: save</p>  
	 * <p>Description: 恢复单个调度</p>  
	 * @param id
	 * @return 
	 * @author HeYang
	 * @date 2020年4月17日  
	 * @version 1.0
	 */
	@Transactional
	public int restart(Integer id) {
		ScheduleJobBean data = dao.query(id);
		if(data==null) {
			throw new DataAccessException("该任务不存在") ;
		}
		ScheduleJobBean sche = new ScheduleJobBean();
		sche.setJobId(id).setState(1);
		int i = dao.update(sche);
		boolean flag = quartzManager.restartJob(data.getName(), data.getGroup());
		if(i > 0 && flag) {
			return i;
		}else {
			return 0;
		}
	}
	
}
